home *** CD-ROM | disk | FTP | other *** search
/ Hardcore Visual Basic 5.0 (2nd Edition) / Hardcore Visual Basic 5.0 - Second Edition (1997)(Microsoft Press).iso / Code / list.cls < prev    next >
Text File  |  1997-06-14  |  8KB  |  256 lines

  1. VERSION 1.0 CLASS
  2. BEGIN
  3.   MultiUse = -1  'True
  4. END
  5. Attribute VB_Name = "CList"
  6. Attribute VB_GlobalNameSpace = False
  7. Attribute VB_Creatable = True
  8. Attribute VB_PredeclaredId = False
  9. Attribute VB_Exposed = True
  10. Option Explicit
  11.  
  12. Public Enum EErrorList
  13.     eeBaseList = 13100  ' CList
  14. End Enum
  15.  
  16. Private lnkHead As CLink
  17. Private c As Long
  18.  
  19. ' Make data structure available to cooperating classes
  20. Friend Property Get Head() As CLink
  21.     Set Head = lnkHead
  22. End Property
  23.  
  24. ' Insert at head of list
  25. Sub Add(vItem As Variant)
  26.     ' Create temporary link with new value
  27.     Dim lnkTmp As CLink
  28.     Set lnkTmp = New CLink
  29.     If IsObject(vItem) Then
  30.         Set lnkTmp.Item = vItem
  31.     Else
  32.         lnkTmp.Item = vItem
  33.     End If
  34.     ' Point it where previous head pointed
  35.     Set lnkTmp.NextLink = lnkHead
  36.     ' Attach it to front
  37.     Set lnkHead = lnkTmp
  38.     ' lnkTmp temporary goes out of scope and disappears
  39.     c = c + 1
  40. End Sub
  41.  
  42. Sub Remove(Optional vIndex As Variant = 1)
  43.     ' Can't remove from empty list
  44.     If lnkHead Is Nothing Then Exit Sub
  45.     ' Walk through to find the item
  46.     Dim i As Long, lnkTmp As CLink, walker As New CListWalker
  47.     Dim iIndex As Long, sIndex As String
  48.  
  49.     walker.Attach Me
  50.     ' Save last link for unhooking current
  51.     Set lnkTmp = lnkHead
  52.     ' Find the matching link
  53.     If VarType(vIndex) = vbString Then
  54.         ' Remove by string key (ignore if no string compare)
  55.         sIndex = vIndex
  56.         Do While walker.More
  57.             On Error Resume Next
  58.             With walker.CurLink
  59.                 If .Item = sIndex Then
  60.                     If walker.CurLink Is lnkHead Then
  61.                         ' First can be deleted only by changing head
  62.                         Set lnkHead = .NextLink
  63.                     Else
  64.                         ' Delete matching link by hooking
  65.                         ' its next to previous
  66.                         Set lnkTmp.NextLink = .NextLink
  67.                     End If
  68.                     c = c - 1
  69.                     Exit Sub
  70.                 End If
  71.             End With
  72.             ' Save last link for unhooking current
  73.             Set lnkTmp = walker.CurLink
  74.         Loop
  75.     Else
  76.         ' Remove by numeric index
  77.         iIndex = vIndex
  78.         Do While walker.More
  79.             i = i + 1
  80.             If iIndex = i Then
  81.                 With walker.CurLink
  82.                     If i = 1 Then
  83.                         ' First can be deleted only by changing head
  84.                         Set lnkHead = .NextLink
  85.                     Else
  86.                         ' Delete matching link by hooking
  87.                         ' its next to previous
  88.                         Set lnkTmp.NextLink = .NextLink
  89.                     End If
  90.                     c = c - 1
  91.                     Exit Sub
  92.                 End With
  93.             End If
  94.             ' Save last link for unhooking current
  95.             Set lnkTmp = walker.CurLink
  96.         Loop
  97.     End If
  98.     ' No match found
  99. End Sub
  100.  
  101. Property Get Count() As Long
  102.     Count = c
  103. End Property
  104.  
  105. ' Remove all items
  106. Sub Clear()
  107.     If lnkHead Is Nothing Then Exit Sub
  108.     Do Until lnkHead.NextLink Is Nothing
  109.         Set lnkHead.NextLink = lnkHead.NextLink.NextLink
  110.     Loop
  111.     Set lnkHead = Nothing
  112.     c = 0
  113. End Sub
  114.  
  115. ' Default property
  116. Property Get Item(Optional vIndex As Variant = 1) As Variant
  117. Attribute Item.VB_UserMemId = 0
  118.     If lnkHead Is Nothing Then Exit Property
  119.     ' Walk through to find the item
  120.     Dim walker As New CListWalker, v As Variant
  121.     Dim i As Long, iIndex As Long, sIndex As String
  122.     
  123.     ' Find the matching link
  124.     walker.Attach Me
  125.     If VarType(vIndex) = vbString Then
  126.         ' Search by string key
  127.         sIndex = vIndex
  128.         ' Ignore error for entries that can't be string compared
  129.         On Error Resume Next
  130.         Do While walker.More
  131.             With walker.CurLink
  132.                 If .Item = sIndex Then
  133.                     If IsObject(.Item) Then
  134.                         Set Item = .Item
  135.                     Else
  136.                         Item = .Item
  137.                     End If
  138.                 End If
  139.             End With
  140.         Loop
  141.     Else
  142.         ' Search by numeric index
  143.         iIndex = vIndex
  144.         Do While walker.More
  145.             i = i + 1
  146.             With walker.CurLink
  147.                 If iIndex = i Then
  148.                     If IsObject(.Item) Then
  149.                         Set Item = .Item
  150.                     Else
  151.                         Item = .Item
  152.                     End If
  153.                 End If
  154.             End With
  155.         Loop
  156.     End If
  157.     ' Item = Empty
  158. End Property
  159.  
  160. Property Let Item(Optional vIndex As Variant = 1, vItemA As Variant)
  161.     If lnkHead Is Nothing Then Exit Property
  162.     ' Walk through to find the item
  163.     Dim walker As New CListWalker, v As Variant
  164.     Dim i As Long, iIndex As Long, sIndex As String
  165.     ' Check type outside loop
  166.     If VarType(vIndex) = vbString Then
  167.         sIndex = vIndex
  168.         iIndex = -1
  169.     Else
  170.         iIndex = vIndex
  171.     End If
  172.     
  173.     ' Find the matching link
  174.     walker.Attach Me
  175.     Do While walker.More
  176.         i = i + 1
  177.         With walker.CurLink
  178.             If iIndex = -1 Then
  179.                 ' Ignore error for entries that can't be string compared
  180.                 On Error Resume Next
  181.                 If .Item = sIndex Then .Item = vItemA
  182.                 On Error GoTo 0
  183.             Else
  184.                 If CLng(vIndex) = i Then .Item = vItemA
  185.             End If
  186.         End With
  187.     Loop
  188.     ' Item = Empty
  189. End Property
  190.  
  191. Property Set Item(Optional vIndex As Variant = 1, vItemA As Variant)
  192.     If lnkHead Is Nothing Then Exit Property
  193.     ' Walk through to find the item
  194.     Dim walker As New CListWalker, v As Variant
  195.     Dim i As Long, iIndex As Long, sIndex As String
  196.     ' Check type outside loop
  197.     If VarType(vIndex) = vbString Then
  198.         sIndex = vIndex
  199.         iIndex = -1
  200.     Else
  201.         iIndex = vIndex
  202.     End If
  203.     
  204.     ' Find the matching link
  205.     walker.Attach Me
  206.     Do While walker.More
  207.         i = i + 1
  208.         With walker.CurLink
  209.             If iIndex = -1 Then
  210.                 ' Ignore error for entries that can't be string compared
  211.                 On Error Resume Next
  212.                 If .Item = sIndex Then Set .Item = vItemA
  213.                 On Error GoTo 0
  214.             Else
  215.                 If CLng(vIndex) = i Then Set .Item = vItemA
  216.             End If
  217.         End With
  218.     Loop
  219.     ' Item = Empty
  220. End Property
  221.  
  222. ' NewEnum must have the procedure ID -4 in Procedure Attributes dialog
  223. ' Create a new data walker object and connect to it
  224. Public Function NewEnum() As IEnumVARIANT
  225. Attribute NewEnum.VB_UserMemId = -4
  226.     ' Create a new iterator object
  227.     Dim listwalker As CListWalker
  228.     Set listwalker = New CListWalker
  229.     ' Connect it with collection data
  230.     listwalker.Attach Me, True
  231.     ' Return it
  232.     Set NewEnum = listwalker.NewEnum
  233. End Function
  234.  
  235. '
  236. #If fComponent = 0 Then
  237. Private Sub ErrRaise(e As Long)
  238.     Dim sText As String, sSource As String
  239.     If e > 1000 Then
  240.         sSource = App.ExeName & ".List"
  241.         Select Case e
  242.         Case eeBaseList
  243.             BugAssert True
  244.        ' Case ee...
  245.        '     Add additional errors
  246.         End Select
  247.         Err.Raise COMError(e), sSource, sText
  248.     Else
  249.         ' Raise standard Visual Basic error
  250.         sSource = App.ExeName & ".VBError"
  251.         Err.Raise e, sSource
  252.     End If
  253. End Sub
  254. #End If
  255.  
  256.